#!/usr/bin/env python3
"""
学术研究自动化系统 - 唯一启动入口

此脚本是系统的唯一启动入口，负责：
1. 检查系统依赖
2. 创建必要目录
3. 初始化数据库
4. 启动Flask应用服务器

使用方法：
- 直接运行此脚本: python run_system.py
- 或通过双击运行(Windows)
"""

import os
import sys
import webbrowser
import time
from pathlib import Path
import logging
import io
import encodings

# 配置日志 - 解决Windows下GBK编码问题
class UnicodeSafeStreamHandler(logging.StreamHandler):
    def emit(self, record):
        try:
            # 尝试使用UTF-8编码输出
            msg = self.format(record)
            stream = self.stream
            if hasattr(stream, 'buffer'):
                stream.buffer.write(msg.encode('utf-8') + b'\n')
            else:
                stream.write(msg + '\n')
            self.flush()
        except Exception:
            # 如果UTF-8失败，使用替代字符集
            super().emit(record)

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('logs/startup.log', encoding='utf-8'),
        UnicodeSafeStreamHandler()
    ]
)
logger = logging.getLogger(__name__)

def check_dependencies():
    """检查依赖是否安装"""
    logger.info("检查系统依赖...")
    
    required_packages = [
        'flask', 'flask_cors', 'requests', 'sqlite3', 
        'pathlib', 'datetime', 'json', 'uuid'
    ]
    
    missing_packages = []
    
    for package in required_packages:
        try:
            if package == 'sqlite3':
                import sqlite3
            elif package == 'pathlib':
                from pathlib import Path
            elif package == 'datetime':
                from datetime import datetime
            elif package == 'json':
                import json
            elif package == 'uuid':
                import uuid
            elif package == 'flask_cors':
                import flask_cors
            else:
                __import__(package)
            logger.info(f"  ✓ {package}")
        except ImportError:
            missing_packages.append(package)
            logger.error(f"  ✗ {package}")
    
    if missing_packages:
        logger.error(f"\n警告: 缺少依赖包: {', '.join(missing_packages)}")
        logger.error("请运行以下命令安装:")
        logger.error(f"pip install {' '.join(missing_packages)}")
        return False
    
    logger.info("所有依赖检查通过!")
    return True

def setup_directories():
    """创建必要的目录"""
    logger.info("创建必要目录...")
    
    directories = [
        'data',
        'data/uploads', 
        'data/cache',
        'data/exports',
        'logs',
        'static/css',
        'templates'
    ]
    
    for directory in directories:
        try:
            Path(directory).mkdir(parents=True, exist_ok=True)
            logger.info(f"  ✓ {directory}")
        except Exception as e:
            logger.error(f"  ✗ 创建目录 {directory} 失败: {str(e)}")
            return False
    
    logger.info("目录创建完成!")
    return True

def initialize_database():
    """初始化数据库"""
    logger.info("初始化数据库...")
    
    try:
        from app import init_database
        init_database()
        logger.info("数据库初始化完成!")
        return True
    except ImportError as e:
        logger.error(f"导入app模块失败: {e}")
        logger.error("请检查app.py文件是否存在且可导入")
        return False
    except Exception as e:
        logger.error(f"数据库初始化失败: {str(e)}")
        logger.error("请检查数据库文件权限或路径是否正确")
        return False

def start_server():
    """启动服务器"""
    logger.info("启动学术研究自动化系统...")
    
    try:
        # 导入并创建应用
        from app import create_app
        app = create_app()
        
        logger.info("应用创建成功!")
        logger.info("系统启动中...")
        logger.info("访问地址: http://localhost:8080")
        logger.info("调试模式: 已启用")
        logger.info("\n" + "="*50)
        logger.info("学术研究自动化系统已启动!")
        logger.info("="*50)
        
        # 延迟打开浏览器
        def open_browser():
            time.sleep(2)
            try:
                webbrowser.open('http://localhost:8080')
                logger.info("已自动打开浏览器")
            except Exception as e:
                logger.warning(f"无法自动打开浏览器: {str(e)}")
                logger.info("请手动访问 http://localhost:8080")
        
        import threading
        browser_thread = threading.Thread(target=open_browser)
        browser_thread.daemon = True
        browser_thread.start()
        
        # 启动Flask应用
        app.run(
            host='0.0.0.0',
            port=8080,
            debug=True,
            use_reloader=False  # 避免重复启动
        )
        
    except ImportError as e:
        logger.error(f"导入app模块失败: {e}")
        logger.error("请检查app.py文件是否存在且可导入")
        return False
    except Exception as e:
        logger.error(f"服务器启动失败: {str(e)}")
        logger.error("请检查端口是否被占用或配置是否正确")
        return False
    return True

def main():
    """主函数"""
    logger.info("学术研究自动化系统启动器")
    logger.info("="*50)
    
    # 检查Python版本
    if sys.version_info < (3, 8):
        logger.error("需要Python 3.8或更高版本")
        logger.error(f"当前版本: {sys.version}")
        sys.exit(1)
    
    logger.info(f"Python版本: {sys.version.split()[0]}")
    
    # 检查依赖
    if not check_dependencies():
        logger.error("依赖检查失败，无法继续启动")
        sys.exit(1)
    
    # 创建目录
    if not setup_directories():
        logger.error("目录创建失败，无法继续启动")
        sys.exit(1)
    
    # 初始化数据库
    if not initialize_database():
        logger.error("数据库初始化失败，无法继续启动")
        sys.exit(1)
    
    # 启动服务器
    try:
        if not start_server():
            logger.error("服务器启动失败")
            sys.exit(1)
    except KeyboardInterrupt:
        logger.info("\n\n系统已停止")
        logger.info("感谢使用学术研究自动化系统!")
    except Exception as e:
        logger.error(f"\n系统运行出错: {str(e)}")
        sys.exit(1)

if __name__ == "__main__":
    main()